package jsch_demo;

import com.jcraft.jsch.*;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

/**
 * Author: hu
 * Date: 2023/5/18 15:12
 */
public class jschTest {
    Session session = null;
    Channel channel = null;

    public ChannelSftp getChannelSftp() throws JSchException {
        // ssh服务器的IP、用户名、密码和端口
//        String sftpHost = "192.168.2.250";
//        String sftpUsername = "hu";
//        String sftpPassword = "123456";

        String sftpHost = "161.189.160.213";
        String sftpUsername = "test";
        String sftpPassword = "123456";
        int sftpPort = 22;

        JSch jsch = new JSch(); // 创建JSch对象
        session = jsch.getSession(sftpUsername, sftpHost, sftpPort);// 获取sesson对象
        session.setPassword(sftpPassword);// 设置sftp访问密码

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("PubkeyAcceptedKeyTypes","no");
        session.setConfig(config);// 为session重新设置参数
        session.setTimeout(30000);// 设置超时
        session.connect();// 建立连接
        channel = session.openChannel("ssh"); // 打开sftp通道
        channel.connect();// 建立sftp通道连接
        return (ChannelSftp) channel;
    }

    public static void main(String[] args) {
         /*JSch支持三种文件传输模式：
         OVERWRITE 完全覆盖模式，这是JSch的 默认文件传输模式，即如果目标文件已经存在，传输的文件将完全覆盖目标文件，产生新的文件。
         RESUME 恢复模式，如果文件已经传输一部分，这时由于网络或其他任何原因导致文件传输中断，如果下一次传输相同的文件，则会从上一次中断的地方续传。
         APPEND 追加模式，如果目标文件已存在，传输的文件将在目标文件后追加。*/

        String srcFile = "D:\\hu_workspace\\hubb\\top\\oop.txt";
        String destFile = "/h1/jsch.txt";
        try {
            jschTest sftpChannel = new jschTest();
            ChannelSftp channel = sftpChannel.getChannelSftp();
            OutputStream out = channel.put(destFile, ChannelSftp.OVERWRITE);  // 这里使用OVERWRITE模式
            // 默认使用OVERWRITE模式
            byte[] buff = new byte[1024 * 256]; // 设定每次传输的数据块大小为256KB
            int read;
            if (out != null) {
                System.out.println("Start to read input stream");
                InputStream is = new FileInputStream(srcFile);
                do {
                    read = is.read(buff, 0, buff.length);
                    if (read > 0) {
                        out.write(buff, 0, read);
                    }
                    out.flush();
                } while (read >= 0);
            }

            System.out.println("传输完成");
            channel.quit();
            sftpChannel.closeChannel();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void closeChannel() {
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
        System.out.println("关闭");
    }
}

